fn add_one(x: i32)->i32{
    x+1
}
fn add_two(f:fn(i32)->i32,x:i32)->i32{
    f(x)+f(x)
}

#[derive(Debug)]
enum Status{
    Value(u32), //枚举变体，被实现为构造函数
    Stop,
}
//wrong demo:
// fn returns_closer()->Fn(i32)->i32{
//     |x|x+1
// }

fn returns_closure()->impl Fn(i32)->i32{
    |x|x+1
}
//返回的Fn大小不固定，需要包裹起来。
fn returns_closure2()->Box<dyn Fn(i32)->i32>{
    Box::new(|x|x+1)
}
fn returns_closure3()->fn(i32)->i32{
    |x|x+1
}

//fn是一个类型， 所有的fn都实现了Fn,FnMut ,FnOnce，所以可以用闭包的时候都可以替换为函数。
fn main() {
    println!("Hello, world!");
    let x=add_one(1);
    println!("x={}",x);
    let y=add_two(add_one,5);
    println!("y={}",y);

    let l =vec![1,2,3];
    let l_str=l.iter().map(|x|x.to_string()).collect::<Vec<String>>();
    println!("{:?}",l_str);
    let l_str2=l.iter().map(ToString::to_string).collect::<String>();

    let mut s=Status::Value(3); //枚举变体，被实现为构造函数
    let rst:Vec<_>=(0u32..20).map(Status::Value).collect();
    println!("{:?}",rst);

    let z=returns_closure3()(2);
    println!("z={}",z);
    use std::vec;
    let mut v=vec::Vec::new();
    v.push(1);
    let v2= vec::from_elem(1,10);
    println!("{:?}",v2);
    println!("{:?}",v);
    let mut v3=vec![2;10];
    println!("{:?}",v3);

}
